#ifndef KPEXTOPIMGF32C2MAGNITUDE_H
#define KPEXTOPIMGF32C2MAGNITUDE_H

#include "kpextVkContext.h"
#include "kpextBaseCompute.h"

namespace kpext {

/**
 * @brief 双通道32位单精度浮点数图像计算矢量幅值
 */
class OpImgF32C2Magnitude : public BaseCompute{
public:
    explicit OpImgF32C2Magnitude(kpextVkContext * ctx);

    virtual ~OpImgF32C2Magnitude() override;

    /**
     * @brief  重新构建计算管线及相关资源
     * @param cols  输入二维图像的列数
     * @param rows  输入二维图像的行数
     * @param inbuf  输入缓冲
     * @param outbuf  输出缓冲
     * @param out_cols 输出缓冲的列数, 如果为-1表示与输入相同
     * @param doLog  是否在计算幅值后进行Log运算
     * @param prescale 如果doLog为true, Log运算前进行的缩放倍数
     * @param alpha 输出前进行的缩放倍数
     * @param beta  输出前进行的偏移
     */
    virtual void rebuild(int cols, int rows,
                         std::shared_ptr<BaseBuffer> inbuf,
                         std::shared_ptr<BaseBuffer> outbuf,
                         int out_cols = -1,
                         bool doLog = false,
                         float prescale = 1.0f,
                         float alpha = 1.0f,
                         float beta = 0
                         );

protected:

    /**
     * @brief 计算着色器的work group size
     */
    std::array<uint32_t, 3> m_workGroupSize;

    /**
     * @brief 输出列尺寸
     */
    uint32_t m_out_cols;

private:
    using BaseCompute::rebuild;

};  // kpextOpImgCvtF32C1toF32C2

} // namespace kpext

#endif // KPEXTOPIMGF32C2MAGNITUDE_H
